package org.uam.common;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

@SuppressWarnings("unchecked")
public class IbatisGenericDao extends SqlMapClientDaoSupport
{

    /**
     * 通过对象新增记录
     * 
     * @param o
     *            对象
     */
    public void create(Object o)
    {
        getSqlMapClientTemplate().insert(
                getStatementId(o.getClass(), ResourceCommon.POSTFIX_INSERT), o);
    }

    /**
     * 通过对象修改记录
     * 
     * @param o
     *            对象
     * @return
     */
    public int modify(Object o)
    {
        return getSqlMapClientTemplate().update(
                getStatementId(o.getClass(), ResourceCommon.POSTFIX_UPDATE), o);
    }

    /**
     * 通过对象删除记录
     * 
     * @param o
     *            对象
     * @return
     */
    public int remove(Object o)
    {
        return getSqlMapClientTemplate().update(
                getStatementId(o.getClass(), ResourceCommon.POSTFIX_DELETE), o);
    }

    /**
     * 通过被序列化的id（主键），删除id对应记录
     * 
     * @param <T>
     *            待声明类型
     * @param entityClass
     *            实体类
     * @param id
     *            主键id
     */
    public <T> void removeById(Class<T> entityClass, Serializable id)
    {
        getSqlMapClientTemplate().delete(
                getStatementId(entityClass,
                        ResourceCommon.POSTFIX_DELETE_PRIAMARYKEY), id);
    }

    /**
     * 通过id批量删除对应记录
     * 
     * @param <T>
     *            待声明类型
     * @param entityClass
     *            实体类
     * @param ids
     *            id数组
     */
    public <T> void removeByIds(Class<T> entityClass, String... ids)
    {
        String id = GenericUtils.createBlock(ids);

        getSqlMapClientTemplate().delete(
                getStatementId(entityClass, ResourceCommon.POSTFIX_DELETE_IDS),
                id);
    }

    /**
     * 根据id获取对象
     * 
     * @param <T>
     *            待声明类型
     * @param entityClass
     *            实体类
     * @param id
     *            主键id
     * @return 对象
     */
    public <T> T get(Class<T> entityClass, Serializable id)
    {
        T o = (T) getSqlMapClientTemplate().queryForObject(
                getStatementId(entityClass, ResourceCommon.POSTFIX_SELECT), id);

        return o;
    }

    /**
     * 获取所有行数
     * 
     * @param <T>
     * @param entityClass
     * @return
     */
    public <T> int getCount(Class<T> entityClass)
    {
        return (Integer) getSqlMapClientTemplate().queryForObject(
                getStatementId(entityClass, ResourceCommon.POSTFIX_COUNT));
    }

    /**
     * 通过查询条件获取满足条件的总行数
     * 
     * @param <T>
     * @param entityClass
     * @param map
     * @return
     */
    public <T> int getCount(Class<T> entityClass, Object parameters)
    {
        return (Integer) getSqlMapClientTemplate().queryForObject(
                getStatementId(entityClass, ResourceCommon.POSTFIX_COUNT),
                parameters);
    }

    /**
     * 通过查询条件获取满足条件的总行数
     * 
     * @param <T>
     * @param entityClass
     * @param map
     * @return
     */
    public <T> int getCount(Class<T> entityClass, String statementId,
            Object parameters)
    {
        return (Integer) getSqlMapClientTemplate().queryForObject(
                getStatementId(entityClass, statementId), parameters);
    }

    /**
     * 获取所有对象
     * 
     * @param <T>
     *            声明类型
     * @param entityClass
     *            实体类
     * @return 列表
     */
    public <T> List getAll(Class<T> entityClass)
    {
        List<T> list = getSqlMapClientTemplate().queryForList(
                getStatementId(entityClass, ResourceCommon.POSTFIX_GETALL));

        return list;
    }

    /**
     * 通过map获取列表信息
     * 
     * @param <T>
     * @param entityClass
     * @param map
     * @return
     */
    public <T> List getListByMap(Class<T> entityClass, Object parameters)
    {
        if (parameters == null)
        {
            return getAll(entityClass);
        }
        else
        {
            return getSqlMapClientTemplate().queryForList(
                    getStatementId(entityClass,
                            ResourceCommon.POSTFIX_SELECTMAP), parameters);

        }
    }

    /**
     * 通过map(入参)获取存储过程返回的列表信息
     * 
     * @param <T>
     * @param entityClass
     * @param map
     * @return
     */
    public <T> List getListByProcMap(Class<T> entityClass, Map map)
    {
        getSqlMapClientTemplate().queryForList(
                getStatementId(entityClass, ResourceCommon.POSTFIX_PROCEDURE),
                map);

        return (List) map.get("result");

    }

    /**
     * 通过自定义的sql查询对象
     * 
     * @param <T>
     * @param entityClass
     * @param statementId
     * @param parameters
     * @return
     */
    public <T> T getObjectByCustom(Class<T> entityClass, String statementId,
            Object parameters)
    {
        T o = (T) getSqlMapClientTemplate().queryForObject(
                getStatementId(entityClass, statementId), parameters);

        return o;
    }

    /**
     * 通过自定义的sql查询列表
     * 
     * @param <T>
     * @param entityClass
     * @param statementId
     * @param parameters
     * @return
     */
    public <T> List getListByCustom(Class<T> entityClass, String statementId,
            Object parameters)
    {
        List<T> list = getSqlMapClientTemplate().queryForList(
                getStatementId(entityClass, statementId), parameters);

        return list;
    }

    /**
     * 通过自定义的sql修改对象信息
     * 
     * @param <T>
     * @param entityClass
     * @param statementId
     * @param parameters
     */
    public <T> void modifyCustom(Class<T> entityClass, String statementId,
            Object parameters)
    {
        getSqlMapClientTemplate().update(
                getStatementId(entityClass, statementId), parameters);
    }

    /**
     * 获取sql标签
     * 
     * @param entityClass
     * @param suffix
     * @return
     */
    public String getStatementId(Class entityClass, String suffix)
    {
        String className = entityClass.getName();
        String shortName = className.replace(entityClass.getPackage().getName()
                + ".", "");
        return shortName + suffix;
    }

}
